<header>
    理解prototype和__proto__（继承与原型链）
</header>
<img src="./images/prototype-_proto_.jpg">
<p>
    从关系图中可以看出来，ECMAScript中创建一个对象是通过new构造函数实现的，而本质上来说这个对象其实是以构造函数的属性prototype指向的对象为基本模板的，因此新对象的__proto__属性表明了自己来源于谁。
</p>
<h2>
    prototype
</h2>
<p>
    该属性用来指向创建一个对象的基本模板，默认指向new构造函数，也可以修改，或者通过改属性为新对象添加属性。
</p>
<p>
    需要注意的是，该属性只有函数才有。
</p>
<pre tag="javascript">
//构造函数
function Clazz(name) {
    this.name = name;
}

//创建对象
var clazz = new Clazz('你好zxl20070701');

//通过prototype给对象添加方法
Clazz.prototype.getName = function () {
    alert(this.name);
};

clazz.getName();
</pre>
<h2>
    __proto__
</h2>
<p>
    这个是对象上的属性，比较有意思，因为不是标准中规定的，使用的时候要小心。
</p>
<p>
    该属性的意思指创建该对象的构造函数的prototype，因此你可以通过对象的该属性修改原型。
</p>
<pre tag="javascript">
function Clazz(name) {
    this.name = name;
}

var clazz = new Clazz('你好');
var clazz2 = new Clazz('zxl20070701');

//通过__proto__给原型添加方法，这样创建的对象也会有该方法
clazz2.__proto__.getName = function () {
    alert(this.name);
};

clazz.getName();
</pre>